module keyexp(
    input clk,
    input rst_n,
    input keysel,           // 当前轮密钥选择 0 初始   1寄存器中值
    input rd_en_keyexp_regs,//
    input wr_en_keyexp_regs,//
    input [3:0]addr,      // 扩展密钥寄存器堆
    input rcon_en,        // 轮常数写入寄存器
    input [127:0]key,     // 输入的初始密钥
    output [127:0]exp_key // 扩展的密钥输出
);  
    wire [7:0] ron_count;
    wire [31:0]xor1,xor2,xor3,xor4,xor5;
    wire [31:0]subword,rotword;
    wire [127:0] round_key_in,round_key_out;

    // MUX
    assign round_key_in = (key & {128{!keysel}}) | ({xor2,xor3,xor4,xor5} & {128{keysel}});

    // REG
    reg_128 round_key_reg(clk,rd_en_keyexp_regs,round_key_in,round_key_out);

    // ROT
    assign rotword={round_key_out[23:0],round_key_out[31:24]};

    // SUB
    genvar i;
    generate
        for(i=0;i<4;i=i+1)begin : key_exp_sbox
            sbox_fpga sbox0(rotword[8*(i+1)-1:8*i],subword[8*(i+1)-1:8*i]);
        end
    endgenerate
    
    // RCON
    rcon rcon0(clk,rst_n,rcon_en,ron_count);

    // XOR
    assign xor1 = {ron_count,24'h0000_00} ^ subword;
    assign xor2 = round_key_out[127:96]   ^ xor1;
    assign xor3 = round_key_out[95:64]    ^ xor2;
    assign xor4 = round_key_out[63:32]    ^ xor3;
    assign xor5 = round_key_out[31:0]     ^ xor4;

    // HEAP
    round_key_reg_heap heap(clk,rst_n,wr_en_keyexp_regs,addr,round_key_in,exp_key);

endmodule